package Alibaba;

import java.util.LinkedList;
import java.util.List;

/**
 * @author zhangmin
 * @create 2022-01-29 13:51
 *
 * 39. 组合总和
 * 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ，找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ，
 * 并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。
 * 如果至少一个数字的被选数量不同，则两种组合是不同的。 对于给定的输入，保证和为 target 的不同组合数少于 150 个。
 * 回溯：路径：已选择的数组
 *      选择列表：index位置的数字要或者不要
 *      终止条件：path中的和超过target或者刚好达到或者index叨叨candidates的最后一个元素
 */
public class combinationSum39 {
    List<List<Integer>> res=new LinkedList<>();
    void backtrack(int[] canditates,int index,int target,LinkedList<Integer> path){
        if (target==0){
            res.add(new LinkedList<>(path));
            return;
        }
        if (target<0) return;
        if (index==canditates.length)return;
        //做出选择
        path.add(canditates[index]);
        backtrack(canditates,index,target-canditates[index],path);
        path.removeLast();

        //不要index元素了
        backtrack(canditates,index+1,target,path);
    }
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backtrack(candidates,0,target,new LinkedList<>());
        return res;
    }
}
